package com.cw1.design1Single;

/**
 * @Author qiuMi
 * @description 懒汉式 - 线程安全 - 同步代码块
 * @Date 2022-09-26 22:45
 **/
public class SingleTest05 {
    public static void main(String[] args) {

    }
}

/**
 * 懒汉式 - 线程安全 - 同步代码块
 * -- 线程因为不可见,会造成双实例对象的过程
 */
class Single5{
    private static Single5 instance;
    private Single5(){}
    /*
    * ① 这种方式，本意是想对第四种实现方式的改进,
    * 因为前面同步方法效率太低，改为同步产生实例化的的代码块
    * ② 但是这种同步并不能起到线程同步的作用。
    * 跟第3种实现方式遇到的情形一致，
    * 假如一个线程进入了if (singleton == null)判断语句块，
    * 还未来得及往下执行，另一个线程也通过了这个判断语句，
    * 这时便会产生多个实例
    * ③ 在实际开发中，不能使用这种方式
    * */
    /**
     * 利用 synchronized 静态
     * @return Single5
     */
    public static Single5 getInstance(){
        if (null == instance){
            synchronized (Single5.class){
                instance = new Single5();
            }
        }
        return instance;
    }
}